package org.dbutils.dao.impl;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.dbutils.dao.StaffDao;
import org.dbutils.entity.Staff;
import org.dbutils.util.DruidUtil;

import java.sql.SQLException;
import java.util.List;

/**
 * StaffDao接口的实现 - 基于 Apache DbUtils 实现
 *
 * @author You are V king
 * @date 2025-02-25
 */
public class StaffDaoImplDBUtils implements StaffDao {

    // 第二：定义 DbUtils 工具类的 SQL 执行器
    QueryRunner qr = new QueryRunner(DruidUtil.getDataSource());

    @Override
    public int insert(Staff staff) {
        // 第一：定义要操作的SQL语句
        String sql = "insert into staffs(name,age,phone,sta_pos) values (?,?,?,?)";

        // 第二：执行 SQL 语句
        Object[] params = {staff.getName(), staff.getAge(), staff.getPhone(), staff.getStaPos()};
        try {
            // 不定长参数本质上是数组
            return qr.update(sql, params);
        } catch (SQLException e) {
            throw new RuntimeException("添加失败", e);
        }
    }

    @Override
    public int delete(int id) {
        String sql = "delete from staffs where id = ?";
        try {
            return qr.update(sql,id);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public int update(Staff staff) {
        String sql = "update staffs set name = ?,age = ?,phone = ?,sta_pos = ? where id = ?";
        Object params[]={staff.getName(), staff.getAge(), staff.getPhone(), staff.getStaPos(), staff.getId()};
        try {
            return qr.update(sql,params);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public List<Staff> selectByPage(int currentPage, int pageSize) {
        // 注意：实体对象的属性名称和数据表的字段名称必须一致，
        // 否则查询数据不能自动映射
        // 解决：通过别名指定实体对象的属性名称
        String sql = "select id,name,age,phone,sta_pos as staPos,add_time as addTime,update_time as updateTime from staffs limit ?,?" ;
        int limit = (currentPage-1) * pageSize ;

        // 选择 ResultSetHandler 接口的具体实现（策略）
        // 实现把结果集对象转换为用户希望的数据类型（List<Staff>）
        BeanListHandler<Staff> beanListHandler =
                new BeanListHandler<>(Staff.class) ;

        try {
            // ResultSetHandler
            // 执行查询，在 query 方法内部通过调用 rsh.handle(resultSet) 方法，
            // 实现把结果集转换为指定类型
            return qr.query(sql,beanListHandler,limit,pageSize) ;
        } catch (SQLException e) {
            throw new RuntimeException("分页查询异常",e);
        }
    }

    @Override
    public Staff selectById(int id) {
        String sql = "select id,name,age,phone,sta_pos as staPos from staffs where id = ?";
        BeanHandler<Staff> beanHandler =
                new BeanHandler<>(Staff.class) ;
        try {
            return qr.query(sql,beanHandler,id);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}
